package rpcx_label_center

import (
	"database/sql/driver"
	"encoding/json"
	"errors"
	"time"

	"github.com/qida/gohp/timex"
)

// 订阅表，状态
const (
	StatusBaseSubscribe删除     = -10
	StatusBaseSubscribe停用     = -1
	StatusBaseSubscribe新创建未发送 = 10
	StatusBaseSubscribe已发送未完成 = 20
	StatusBaseSubscribe已完成    = 30

	TypeSubscribe历史订阅 = 1
	TypeSubscribe实时订阅 = 2
)

// 订阅任务记录

// 订阅 创建 请求
type ReqCreateBaseSubscribe struct {
	AppId string `json:"AppId"` //应用Id 默认=rtp

	SubscribeName string `json:"SubscribeName"` //订阅名称"
	TypeSubscribe int8   `json:"TypeSubscribe"` //是否为历史调阅 历史=1 实时=2

	DeviceIds  []string `json:"DeviceIds"`  //国标Id集
	DeviceNvrs []string `json:"DeviceNvrs"` //国标Id集

	IdRecSchemes     []string `json:"IdRecSchemes"`     //方案参数Id
	IdSchemes        []int64  `json:"IdSchemes"`        //方案Id
	UserDefinedEqual string   `json:"UserDefinedEqual"` //用户自定义

	DateStart  timex.ODate `json:"DateStart"`  //开始日期"
	DateEnd    timex.ODate `json:"DateEnd"`    //结束日期"
	ImageRate  int         `json:"ImageRate"`  //抽图频率，每张毫秒数
	TimeRanges []TimeRange `json:"TimeRanges"` //订阅时间分段

	Log Log `json:"Log,omitempty"` //追踪日志
}

// 时间段
type TimeRange struct {
	TimeStart timex.OTime `json:"TimeStart"` //1天中开始时间 {
	TimeEnd   timex.OTime `json:"TimeEnd"`   //1天中结束时间 }
}

type TimeRanges []TimeRange

func (o *TimeRanges) Scan(value interface{}) error {
	b, ok := value.([]byte)
	if !ok {
		return errors.New("failed to unmarshal TimeRange value")
	}
	var config []TimeRange
	err := json.Unmarshal(b, &config)
	if err != nil {
		return err
	}
	*o = config
	return nil
}

func (o TimeRange) Value() (driver.Value, error) {
	return json.Marshal(o)
}

func (o *TimeRange) Scan(value interface{}) error {
	b, ok := value.([]byte)
	if !ok {
		return errors.New("failed to unmarshal TimeRange value")
	}
	var config TimeRange
	err := json.Unmarshal(b, &config)
	if err != nil {
		return err
	}
	*o = config
	return nil
}

func (o TimeRanges) Value() (driver.Value, error) {
	return json.Marshal(o)
}

// 订阅 删除 请求
type ReqDeleteBaseSubscribe struct {
	IdSubscribe int64 `json:"IdSubscribe"`   //订阅Id
	Log         Log   `json:"Log,omitempty"` //追踪日志
}

// 订阅 修改 请求
type ReqUpdateBaseSubscribe struct {
	IdSubscribe   int64  `json:"IdSubscribe"`   //订阅Id
	SubscribeName string `json:"SubscribeName"` //订阅名称
	TypeSubscribe int8   `json:"TypeSubscribe"` //是否为历史调阅 历史=1 实时=2

	DeviceNvrs []string `json:"DeviceNvrs"` //设备NVR列表
	DeviceIds  []string `json:"DeviceIds"`  //国标Id集

	IdSchemes        []int64  `json:"IdSchemes"`        //方案Id
	IdRecSchemes     []string `json:"IdRecSchemes"`     //方案参数Id
	UserDefinedEqual string   `json:"UserDefinedEqual"` //用户自定义

	DateStart timex.ODate `json:"DateStart"` //开始日期 2006-01-02
	DateEnd   timex.ODate `json:"DateEnd"`   //结束日期 2006-01-02

	ImageRate  int         `json:"ImageRate"`  //抽图频率，每张毫秒数
	TimeRanges []TimeRange `json:"TimeRanges"` //订阅时间分段

	Status int8 `json:"Status"` //状态 正常=10 禁用=-1

	Log Log `json:"Log,omitempty"` //追踪日志
}

// 订阅 查询 请求
type ReqSearchBaseSubscribe struct {
	AppId string `json:"AppId"` //应用Id 默认=rtp

	KeyWord     string `json:"KeyWord,omitempty"`     //全局关键词
	DeviceId    string `json:"DeviceId,omitempty"`    //设备Id
	DeviceNvr   string `json:"DeviceNvr,omitempty"`   //设备NVR
	IdSubscribe int64  `json:"IdSubscribe,omitempty"` //订阅Id

	IdScheme         int64  `json:"IdScheme,omitempty"`         //方案Id
	IdRecScheme      string `json:"IdRecScheme,omitempty"`      //方案参数Id
	UserDefinedEqual string `json:"UserDefinedEqual,omitempty"` //用户自定义

	SubscribeName string   `json:"SubscribeName,omitempty"` //订阅名称
	TypeSubscribe int8     `json:"TypeSubscribe,omitempty"` //订阅类型 1:历史 2:实时
	Status        int8     `json:"Status,omitempty"`        //状态 正常=10 禁用=-1
	Page          int64    `json:"Page"`                    //必填 指定返回页码号
	Limit         int64    `json:"Limit"`                   //必填 指定返回每页条数
	FieldOrders   []string `json:"FieldOrders,omitempty"`   //指定要排序的字段数组，默认升序，降序加前缀-，如 ["-Id", "Name"] 按Id降序Name升序排列

	Log Log `json:"Log,omitempty"` //追踪日志
}
type ReqBaseSubscribeId struct {
	IdSubscribe int64 `json:"IdSubscribe"` //订阅Id

	Log Log `json:"Log,omitempty"` //追踪日志
}

// 订阅 执行抽图 请求
type ReqHistoryBaseSubscribe struct {
	IdSubscribe int64  `json:"IdSubscribe"` //订阅Id,默认0，所有订阅
	DeviceId    string `json:"DeviceId"`    //设备编码(国标Id)

	Log Log `json:"Log,omitempty"` //追踪日志
}

// 订阅 执行抽图 请求
type ReqRealtimeBaseSubscribe struct {
	DateTimeStart time.Time `json:"DateTimeStart"` //(实时任务选填参数，默认当前时间)任务起点时间,默认是当前时间向后多少秒，配置默认10秒
	SecondLen     int       `json:"SecondLen"`     //(实时任务选填参数，默认以配置文件为准)任务起点向后偏移时长秒
	IdSubscribe   int64     `json:"IdSubscribe"`   //订阅Id,默认0，所有订阅

	Log Log `json:"Log,omitempty"` //追踪日志
}

type RespBaseSubscribe struct {
	AppId string `json:"AppId"` //应用Id 默认=rtp

	IdSubscribe   int64     `json:"IdSubscribe"`   //订阅Id
	SubscribeName string    `json:"SubscribeName"` //订阅名称
	TypeSubscribe int8      `json:"TypeSubscribe"` //订阅类型 1:历史 2:实时
	Status        int8      `json:"Status"`        //状态 正常=10 禁用=-1
	DateStart     time.Time `json:"DateStart"`     //开始日期
	DateEnd       time.Time `json:"DateEnd"`       //结束日期
	ImageRate     int       `json:"ImageRate"`     //抽图频率，每张毫秒数

	DeviceNvrs       []string    `json:"DeviceNvrs"`       //设备NVR列表
	DeviceIds        []string    `json:"DeviceIds"`        //国标Id集
	IdRecSchemes     []string    `json:"IdRecSchemes"`     //AI分析方案参数记录Id
	IdSchemes        []int64     `json:"IdSchemes"`        //AI分析方案参数记录Id
	UserDefinedEqual string      `json:"UserDefinedEqual"` //用户自定义
	TimeRanges       []TimeRange `json:"TimeRanges"`       //订阅时间分段

	TimeCreate time.Time `json:"TimeCreate"` //记录创建时间
	TimeUpdate time.Time `json:"TimeUpdate"` //最后修改时间
}

// 响应 查询列表
type RespBaseSubscribes struct {
	Total          int64               `json:"Total"`          //返回列表的总条数
	BaseSubscribes []RespBaseSubscribe `json:"BaseSubscribes"` //返回列表对象
}

// 订阅 推流 请求

type ReqBaseSubscribeHistory struct {
	IdSubscribe int64 `json:"IdSubscribe"` //订阅Id

	Log Log `json:"Log,omitempty"` //追踪日志
}
